﻿Option Infer On

Namespace Operaties

    Public Class InventarisBL

        Public Shared Function GetInventarisAsXml() As String
            Dim artikelsInVoorraad As List(Of ArtikelsDataSet.ArtikelsRow) = (From x In Utility.Data.Artikels _
                                                                              Where x.Voorraad <> 0).ToList()

            Dim doc As XDocument = _
                <?xml version="1.0" encoding="utf-8" standalone="yes"?>
                <root xmlns="urn:Inventaris">
                    <jaar>2011</jaar>
                    <leveranciers>
                        <%= From leverancier In (From x In artikelsInVoorraad _
                            Order By x.LeveranciersRow.Naam _
                            Group x By groupedData = x.LeveranciersRow Into Group _
                            Select groupedData) Select _
                            <leverancier xmlns="urn:Inventaris" Naam=<%= leverancier.Naam %>>
                                <categorieen>
                                    <%= From categorieNaam In (From x In artikelsInVoorraad _
                                        Where x.IdLeverancier = leverancier.Id _
                                        Order By x.CategorieenRow.Categorie _
                                        Group x By groupedData = x.CategorieenRow.Categorie Into Group _
                                        Select groupedData) Select _
                                        <categorie xmlns="urn:Inventaris" Naam=<%= categorieNaam %>>
                                            <artikels>
                                                <%= From artikel In artikelsInVoorraad _
                                                    Where artikel.CategorieenRow.Categorie = categorieNaam _
                                                    AndAlso artikel.IdLeverancier = leverancier.Id _
                                                    Order By artikel.Artikelcode Select _
                                                    <artikel xmlns="urn:Inventaris">
                                                        <code><%= artikel.Artikelcode %></code>
                                                        <omschrijving><%= artikel.OmschrijvingIngekort(50) %></omschrijving>
                                                        <barcode><%= artikel.Barcode %></barcode>
                                                        <voorraad><%= artikel.Voorraad %></voorraad>
                                                        <korting><%= artikel.KortingLeverancierAsObject() %></korting>
                                                        <prijs><%= artikel.Prijs %></prijs>
                                                        <btw><%= artikel.BTW %></btw>
                                                        <statiegeld><%= artikel.StatiegeldEuro %></statiegeld>
                                                        <stockwaarde><%= artikel.StockWaarde() %></stockwaarde>
                                                        <vpexcl><%= artikel.TotaalPrijsExclusiefBtw() %></vpexcl>
                                                        <vpincl><%= artikel.TotaalPrijsInclusiefBtw() %></vpincl>
                                                    </artikel> %>
                                            </artikels>
                                        </categorie> %>
                                </categorieen>
                            </leverancier> %>
                    </leveranciers>
                </root>

            Return doc.Declaration.ToString() & doc.ToString()
        End Function

        Public Shared Function GetInventarisSamenvattingAsXml() As String
            Dim artikelsInVoorraad As List(Of ArtikelsDataSet.ArtikelsRow) = (From x In Utility.Data.Artikels _
                                                                              Where x.Voorraad <> 0).ToList()

            Dim totalenPerSubcategorie = From x In artikelsInVoorraad _
                                         Group x By x.LeveranciersRow, x.CategorieenRow Into Group _
                                         Select LeveranciersRow.Naam, CategorieenRow.Categorie, CategorieenRow.Subcategorie, _
                                         TotaleStockWaarde = Group.Sum(Function(x) x.StockWaarde()), _
                                         TotaalExclusief = Group.Sum(Function(x) x.TotaalPrijsExclusiefBtw()), _
                                         TotaalInclusief = Group.Sum(Function(x) x.TotaalPrijsInclusiefBtw())

            Dim doc As XDocument = _
                <?xml version="1.0" encoding="utf-8" standalone="yes"?>
                <root xmlns="urn:Inventaris">
                    <jaar><%= DateTime.Today.Year - 1 %></jaar>
                    <leveranciers>
                        <%= From leverancier In (From x In totalenPerSubcategorie _
                            Order By x.Naam _
                            Group x By groupedData = x.Naam Into Group _
                            Select groupedData) Select _
                            <leverancier xmlns="urn:Inventaris" Naam=<%= leverancier %>>
                                <categorieen>
                                    <%= From categorieNaam In (From x In totalenPerSubcategorie _
                                        Where x.Naam = leverancier _
                                        Order By x.Categorie _
                                        Group x By groupedData = x.Categorie Into Group _
                                        Select groupedData) Select _
                                        <categorie xmlns="urn:Inventaris" Naam=<%= categorieNaam %>>
                                            <subcategorieen>
                                                <%= From x In totalenPerSubcategorie _
                                                    Where x.Categorie = categorieNaam _
                                                    AndAlso x.Naam = leverancier _
                                                    Order By x.Subcategorie Select _
                                                    <subcategorie xmlns="urn:Inventaris">
                                                        <leverancier><%= leverancier %></leverancier>
                                                        <categorie><%= categorieNaam %></categorie>
                                                        <subcategorie><%= x.Subcategorie %></subcategorie>
                                                        <stockwaarde><%= x.TotaleStockWaarde %></stockwaarde>
                                                        <vpexcl><%= x.TotaalExclusief %></vpexcl>
                                                        <vpincl><%= x.TotaalInclusief %></vpincl>
                                                    </subcategorie> %>
                                            </subcategorieen>
                                        </categorie> %>
                                </categorieen>
                            </leverancier> %>
                    </leveranciers>
                </root>

            Return doc.Declaration.ToString() & doc.ToString()
        End Function

        Public Shared Sub UpdateLeeggoedVoorVolleFlessen()
            If (Utility.Data.HasChanges()) Then
                Throw New Exception("Er zijn nog wijzigingen die niet bewaard zijn. Gelieve eerst te bewaren.")
            End If

            Dim leeggoedDs As New ArtikelLijstDataSet()
            LeeggoedVanArtikelsDal.FillLeeggoedVanArtikels(leeggoedDs)

            Dim artikelsMetLeeggoed As IEnumerable(Of ArtikelsDataSet.ArtikelsRow) = From a In Utility.Data.Artikels _
                                                                                       Where a.StatiegeldEuro > 0 _
                                                                                       AndAlso a.Voorraad <> 0
            ' eerst zoeken of alle leeggoed gevonden kan worden
            Dim artikelMetLeeggoed As ArtikelsDataSet.ArtikelsRow = Nothing
            For Each artikelMetLeeggoed In artikelsMetLeeggoed
                Dim leeggoedArtikel As ArtikelLijstDataSet.LeeggoedVanArtikelsRow = (From l In leeggoedDs.LeeggoedVanArtikels _
                                                                                    Where l.ArtikelId = artikelMetLeeggoed.Id).FirstOrDefault
                If (leeggoedArtikel Is Nothing) Then
                    ' direct stoppen
                    Throw New Exception(String.Format("Geen overeenkomstig leeggoedartikel gevonden voor artikel {0}: {1}", artikelMetLeeggoed.Id, artikelMetLeeggoed.Omschrijving))
                End If
            Next

            For Each artikelMetLeeggoed In artikelsMetLeeggoed
                Dim leeggoedVanArtikel As ArtikelLijstDataSet.LeeggoedVanArtikelsRow = (From l In leeggoedDs.LeeggoedVanArtikels _
                                                                                    Where l.ArtikelId = artikelMetLeeggoed.Id).First
                Dim leeggoedArtikel As ArtikelsDataSet.ArtikelsRow = Utility.Data.Artikels.FindById(leeggoedVanArtikel.LeeggoedArtikelId)
                If (leeggoedArtikel IsNot Nothing) Then
                    leeggoedArtikel.Voorraad += artikelMetLeeggoed.Voorraad
                Else
                    Throw New Exception("Leeggoedartikel niet geladen")
                End If
            Next
        End Sub

        Public Shared Sub RollbackLeeggoedVoorVolleFlessen()
            Utility.Data.RejectChanges()
        End Sub

    End Class

End Namespace
